import { _decorator, Asset, Component, error, find, instantiate, Node, Prefab, resources, UI } from 'cc';
import { UIBase } from './UIBase';
import { PrefabPath } from './Configs';
import { resMgr } from './Res/ResMgr';
import { SpecialResMgr } from './Res/SpecialResMgr';
const { ccclass, property } = _decorator;

@ccclass('UIRoot')
export class UIRoot extends Component {
    //使用单例，使UIRoot只有一个实例对象.控制所有页面的开关等操作
    private static _instance: UIRoot = null;
    static get instance() {
        return this._instance;
    }


    //存储不同页面所挂载的层级节点(即每个页面所挂载的父节点)
    private _mapLayers: Map<string, Node> = new Map();
    //存储所有已经打开了的界面
    private _mapUI: Map<string, UIBase> = new Map();


    // constructor() {
    //     super();
    //     console.log("随便");

    // }
    start() {
        //设置UIRoot中的_instance实例对象为这个脚本
        UIRoot._instance = this;
        this._init();
    }

    update(deltaTime: number) {

    }

    private _init() {
        //查找UIRoot节点下的所有直接子节点，并将其存储
        let children = this.node.children;
        for (let child of children) {
            if (this._mapLayers.has(child.name)) {
                continue;
            }
            this._mapLayers.set(child.name, child);
        }
        //存储完所有节点后，打开第一个页面：加载页面
        this.openUI("UILoading");
    }

    //打开UI页面，并将其存储到Map容器中
    openUI(uiName: string, layerName?: string, ...rest: any[]) {

        let createUI = ((prefab: Prefab) => {
            let uiNode = instantiate(prefab);
            layerName = layerName || "Normal";
            uiNode.parent = this._mapLayers.get(layerName);
            //存储这个打开的UI节点的父类，方便后续通过父类进行管理
            let uiBaseComp = uiNode.getComponent(UIBase);
            this._mapUI.set(uiName, uiBaseComp);
            console.log(uiName + "页面已打开");

            //将界面打开以后就可以直接退出此函数
            //return;
        });
        //查找此页面是否已经打开过了
        if (this._mapUI.has(uiName)) {
            return;
        }
        //使用预制体管理者，获取对应的预制体界面，
        //TS中的语法：对象?.方法()   如果对象不存在，就不会调用后面的方法
        if (uiName != "UILoading") {
            let ui = resMgr.getMgr<SpecialResMgr>("PrefabMgr")?.getRes<Prefab>(uiName);
            if (ui) {
                createUI(ui);
                return;
            }
        }
        //&&会进行短路，如果ui不存在就直接短路，不会执行后面的函数调用相当于上面的if结构
        //ui && createUI(ui);
        //如果没有打开过就将其打开
        let path = PrefabPath[uiName];
        if (!path) {
            error(uiName + "没有配置路径");
            return;
        }
        //只加载一个预制体资源
        resources.load(path, Prefab, (err, ret) => {
            if (err) {
                error(uiName + "界面加载出错了");
                return;
            }
            createUI(ret);
        });
    }

    //关闭页面
    closeUI(uiName: string, ...args: any[]) {
        if (uiName.length <= 0) {
            return;
        }
        //注意：map容器中获取元素应该使用get,存入到map中应该用set进行存储
        let uiBaseComp = this._mapUI.get(uiName);
        if (!uiBaseComp) {
            return;
        }
        //将节点直接销毁
        uiBaseComp.node.destroy();
        //并且通过名字将这个界面从界面存储容器中销毁
        this._mapUI.delete(uiName);
        console.log(uiName + "页面已关闭");
    }

}


